package com.ssyc.common.appupdate;

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;

import com.ssyc.common.R;
import com.ssyc.common.base.BaseApplication;
import com.ssyc.common.base.SpKeys;
import com.ssyc.common.utils.GsonUtil;
import com.ssyc.common.utils.SPUtil;
import com.vector.update_app.UpdateAppBean;
import com.vector.update_app.UpdateAppManager;
import com.vector.update_app.UpdateCallback;
import com.vector.update_app.listener.ExceptionHandler;
import com.vector.update_app.listener.IUpdateDialogFragmentListener;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;

/**
 * 版本更新的工具类
 * 在四个端的主页面调用即可
 * Created by Administrator on 2018/7/19 0019.
 */

public class AppUpdateUtil {

    //比较服务器APK版本的URL地址
//    public static final String APKVERSONURL = "https://s.moregolden.com/ycsj_platform_nce2/AppVerMsg";
    public static final String APKVERSONURL = "https://www.moregolden.com:8018/ycsj_platform_nce2/AppVerMsg";

    /**
     * 检查版本更新
     *
     * @param activity 当前activity对象
     */
    public static void updateVersion(final Activity activity) {

        Map<String, String> params = new HashMap<>();
        params.put("type", "1");
        params.put("app", "android");
        params.put("page", "0");
        params.put("platform", "8");

        new UpdateAppManager
                .Builder()
                //必须设置，当前Activity
                .setActivity(activity)
                //必须设置，实现httpManager接口的对象
                .setHttpManager(new UpdateAppHttpUtil())
                //必须设置，更新地址
                .setUpdateUrl(APKVERSONURL)
                //全局异常捕获
                .handleException(new ExceptionHandler() {
                    @Override
                    public void onException(Exception e) {
                        e.printStackTrace();
                    }
                })
                //以下设置，都是可选
                //设置请求方式，默认get
                .setPost(true)
                .setParams(params)
                //不显示通知栏进度条
//                .dismissNotificationProgress()
                //是否忽略版本
//                .showIgnoreVersion()
                //添加自定义参数，默认version=1.0.0（app的versionName）；apkKey=唯一表示（在AndroidManifest.xml配置）
//                .setParams(params)
                //设置点击升级后，消失对话框，默认点击升级后，对话框显示下载进度，如果是强制更新，则设置无效
                .hideDialogOnDownloading()
                //设置头部，不设置显示默认的图片，设置图片后自动识别主色调，然后为按钮，进度条设置颜色
                .setTopPic(R.mipmap.top_8)
                //为按钮，进度条设置颜色。
                .setThemeColor(0xffffac5d)
                //设置apk下砸路径，默认是在下载到sd卡下/Download/1.0.0/test.apk
//                .setTargetPath(path)
                //设置appKey，默认从AndroidManifest.xml获取，如果，使用自定义参数，则此项无效
//                .setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
                .setUpdateDialogFragmentListener(new IUpdateDialogFragmentListener() {
                    @Override
                    public void onUpdateNotifyDialogCancel(UpdateAppBean updateApp) {
                        //用户点击关闭按钮，取消了更新，如果是下载完，用户取消了安装，则可以在 onActivityResult 监听到。

                    }
                })
                //不自动，获取
//                .setIgnoreDefParams(true)
                .build()
                //检测是否有新版本
                .checkNewApp(new UpdateCallback() {
                    /**
                     * 解析json,自定义协议
                     *
                     * @param json 服务器返回的json
                     * @return UpdateAppBean
                     */
                    @Override
                    protected UpdateAppBean parseJson(String json) {
                        //版本更新库需要的Bean
                        UpdateAppBean updateAppBean = null;

                        //服务器返回的版本数据json
                        AppBean appBean = null;

                        try {
                            appBean = GsonUtil.jsonToBean(json, AppBean.class);
                        } catch (Exception e) {
                            Log.i("test", "解析版更新数据错误");
                        }

                        if (null != appBean) {

                            updateAppBean = new UpdateAppBean();

                            //附带的额外信息,保存测评题库等是否开放的标识
                            AppBean.ServerjsonBean serverjson = appBean.getServerjson();

                            //保存是否显示测评的标识,0和1
                            SPUtil.put(BaseApplication.context, SpKeys.ISSHOWCP, serverjson.getCp_beta());

                            //保存是否显示题库的标识,0和1
                            SPUtil.put(BaseApplication.context, SpKeys.ISSHOWTK, serverjson.getTk_beta());

                            //获取服务器APK的版本信息
                            AppBean.DataBean appVersion = appBean.getData().get(0);

                            Log.i("test","本地版本号"+getVersionName());
                            Log.i("test","服务器版本号"+appVersion.getVersion());
                            if (!getVersionName().equals(appVersion.getVersion())) {
                                //服务器的版本号与当前APP的版本号不一致的情况下更新
                                //（必须）是否更新Yes,No
                                updateAppBean.setUpdate("Yes")//是否更新
                                        .setNewVersion(appVersion.getVersion())//新版本号
                                        .setApkFileUrl(appVersion.getApkurl())//apk下载地址
                                        .setUpdateLog(appVersion.getContent())//更新日志
                                        .setUpdateDefDialogTitle(String.format("是否升级到最新版本？", appVersion.getVersion()));
                            } else {
                                updateAppBean.setUpdate("No");
                            }

                        }

                        //以下是服务器返回的json方式进行解析
                        try {
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        return updateAppBean;
                    }

                    @Override
                    protected void hasNewApp(UpdateAppBean updateApp, UpdateAppManager updateAppManager) {
                        updateAppManager.showDialogFragment();
                    }

                    /**
                     * 网络请求之前
                     */
                    @Override
                    public void onBefore() {
                    }

                    /**
                     * 网路请求之后
                     */
                    @Override
                    public void onAfter() {
                    }

                    /**
                     * 没有新版本
                     */
                    @Override
                    public void noNewApp(String error) {
                    }
                });

    }

    /**
     * 解析XML版本信息
     * 获取APP更新库需要的模型数据
     *
     * @param xmlString
     * @return
     */
    private static UpdateAppBean parseXML2JavaBean(String xmlString) {
        UpdateAppBean updateAppBean = null;
        try {
            // 创建解析器工厂对象
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            // 使用工石对象产生解析器对象
            XmlPullParser parser = factory.newPullParser();
            // 设置解析的源。要解析的内容
            parser.setInput(new StringReader(xmlString));
            // 获取事件类型
            int type = parser.getEventType();

            while (type != XmlPullParser.END_DOCUMENT) {
                switch (type) {
                    case XmlPullParser.START_TAG:
                        if ("updateinfo".equals(parser.getName())) {
                            updateAppBean = new UpdateAppBean();
                        } else if ("versionName".equals(parser.getName())) {
                            updateAppBean.setNewVersion(parser.nextText());
                        } else if ("url".equals(parser.getName())) {
                            updateAppBean.setApkFileUrl(parser.nextText());
                        } else if ("description".equals(parser.getName())) {
                            updateAppBean.setUpdateLog(parser.nextText());
                        }
                        break;
                    default:
                        break;
                }
                // 推进
                type = parser.next();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return updateAppBean;
    }

    /**
     * 显示应用的版本号
     */
    private static String getVersionName() {
        PackageManager packageManager = BaseApplication.context.getPackageManager();
        String versionName = null;
        try {
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    BaseApplication.context.getPackageName(), 0);
            versionName = packageInfo.versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }

}
